# !/usr/bin/python
# -*- coding=utf-8 -*-
"""
ver 1.4
"""
from django.core.cache import cache
import logging

#  永不过期
EXPIRE_NEVER = None
#  默认过期时间   单位  秒
EXPIRE_DEFAULT = 30 * 60

EXPIRE_5_MIN = 5 * 60

logger = logging.getLogger(__name__)


class CacheTable(object):
    """
    数据表缓存基类, 缓存django models对象
    """
    CACHE_KEY = "bookmgr"  # 缓存一级关键字

    def __init__(self, models_class=None):
        self.models_class = models_class
        if models_class is None:
            class_name = self.__class__.__name__
        else:
            class_name = models_class._meta.db_table
        self.cache_prefix = "%s-%s" % (CacheTable.CACHE_KEY, class_name)
        self.cache_key = ""

    def set_key(self, key):
        """
        设置key
        :param key: 将缓存前缀和key关联，生成当前要存的数据的前缀
        :return:
        """
        key = key.replace(" ", "")  # key不能有空格
        self.cache_key = "%s=%s" % (self.cache_prefix, key)

    def save_obj(self, obj, exp=EXPIRE_DEFAULT):
        """
        设置一个对象的值
        :param obj: 对象
        :param exp: 过期时间
        :return:
        """
        if obj:
            self.set_key(str(obj.pk))
            cache.set(self.cache_key, obj, exp)

    def save_key_value(self, key, value, exp=EXPIRE_DEFAULT):
        """
        保存一个值
        :param key:关键字
        :param value: 值
        :param exp: 过期时间   秒
        :return:
        """
        if key and value:
            self.set_key(key)
            cache.set(self.cache_key, value, exp)

    def get_by_key(self, key):
        """
        通过key查询一个值，这个方法不会去查数据库，只查缓存
        :param key:
        :return:
        """
        self.set_key(str(key))
        obj = cache.get(self.cache_key)
        return obj

    def get_by_id(self, id):
        """
        通过ID查询一个数据，先查询缓存，缓存中没有就查询数据库并存入缓存
        :param id:
        :return:
        """
        # logger.info("id=%s" % id)
        if str(id).strip() == '':
            return None
        self.set_key(str(id))
        obj = cache.get(self.cache_key)
        if not obj:
            obj = self.models_class.objects.filter(pk=id).first()
            if obj:
                self.save_obj(obj)
        return obj

    def delete_by_key(self, key):
        self.set_key(str(key))
        cache.delete(self.cache_key)

    def delete_obj(self, obj):
        """
        删除一个对象
        :param obj:
        :return:
        """
        self.set_key(str(obj.pk))
        cache.delete(self.cache_key)

    def clear_table(self):
        cache.delete_pattern(self.cache_prefix + "*")

    def clear_table_by_name(self, table_name):
        """
        :param table_name:表名称
        :return:
        """
        self.cache_prefix = "%s-%s" % (CacheTable.CACHE_KEY, table_name)
        self.clear_table()

    def keys_start(self, key_prefix):
        """
        返回以key开头的所有key
        :param key_prefix:
        :return:
        """
        m_key = "%s=%s" % (self.cache_prefix, key_prefix)
        return cache.keys(m_key)

    def key_start_first(self, key_prefix):
        """
        返回以key开头的 第一个key
        :param key_prefix:
        :return:
        """
        m_key = "%s=%s" % (self.cache_prefix, key_prefix)
        lst = cache.keys(m_key)
        if len(lst) > 0:
            return lst[0].replace("%s=" % self.cache_prefix, '')
        return None

